//
// Created by 11510 on 2024/6/15.
//
#include "TextQuery.h"
#include <iostream>
#include <sstream>
#include <fstream>
using std::cin;
using std::cerr;
using std::cout;
using std::endl;
using std::istringstream;
using std::ifstream;


/**
 * 判断一个string是否是一个合法的单词
 * @param str
 * @return
 */
bool TextQuery::isWord(const std::string& str) {
    // 空字符串不是一个单词
    if (str.empty()) {
        return false;
    }
    // 遍历字符串中的每个字符，检查是否都是字母
    for (char c : str) {
        if (!std::isalpha(static_cast<unsigned char>(c))) {
            return false;
        }
    }
    return true;
}


void TextQuery::readFile(const std::string filename) {
    ifstream file;
    file.open(filename);
    if(!file){
        cerr << "file open file failed" << endl;
        exit(-1);
    }

    /* 一行字符串 */
    string line;
    /* 行号 */
    int lineNumber = 0;

    /* 一行一行处理 */
    while(getline(file, line)){
        /* 勾八回车换行 */
        lineNumber++;

        /* 把该行插入到vector */
        lines.push_back(line);

        /* 处理一行中的每个单词 */
        istringstream inputFileLine(line);
        string word;
        while(inputFileLine >> word){
            if(isWord(word)) {
                dict[word]++;
                wordNumbers[word].insert(lineNumber);
            }
        }
    }
    file.close();
}


void TextQuery::query(const std::string &word) {
    printf("%s occurs %d times.\n", word.c_str(), dict[word]);
    for(set<int>::iterator it = wordNumbers[word].begin(); it != wordNumbers[word].end(); it++){

        /* 注意：line下标从0开始所以需要减1 */
        printf("(line %d) %s\n", *it, lines[*it - 1].c_str());
    }

}